<?php

namespace IYUU\sdk\CoolQ\Domain;

use BadRequestException;
use BannedWordsModel;
use Exception;
use function IYUU\sdk\CoolQ\verifyMatchType;

/**
 * 违禁词
 * Class BannedWords
 * @package IYUU\sdk\CoolQ\Domain
 */
class BannedWords
{
    /**
     * 新增
     * @param string $content 匹配内容
     * @param int $match_type 匹配模式
     * @return string
     */
    public static function create(string $content, int $match_type): string
    {
        // 1. 验证匹配内容
        if (empty($content)) {
            return '匹配内容不能为空';
        }
        // 2. 验证匹配模式
        if (!verifyMatchType($match_type)) {
            return '匹配模式：1相等,2包含,3正则' . PHP_EOL . '不正确的：' . $match_type;
        }
        // 3. 查重
        $obj = BannedWordsModel::where('content', $content)->findOrEmpty();
        if (!$obj->isEmpty()) {
            return '违禁词重复，主键为：' . $obj->id;
        }
        // 4. 写入数据库
        $data = [
            'content' => $content,
            'match_type' => $match_type
        ];
        $obj = BannedWordsModel::create($data);

        return '增加成功' . $content . PHP_EOL . '主键为：' . $obj->id;
    }

    /**
     * 编辑
     * @param int $id 主键
     * @param string $content 匹配内容
     * @param int $match_type 匹配模式
     * @return string
     */
    public static function update(int $id, string $content, int $match_type): string
    {
        // 1. 验证ID
        if (0 >= $id) {
            return '主键错误：' . $id;
        }
        // 2. 验证匹配内容
        if (empty($content)) {
            return '匹配内容不能为空';
        }
        // 3. 验证匹配模式
        if (!verifyMatchType($match_type)) {
            return '匹配模式：1相等,2包含,3正则' . PHP_EOL . '不正确的：' . $match_type;
        }
        // 4. 是否存在主键
        $obj = BannedWordsModel::where('id', $id)->findOrEmpty();
        if ($obj->isEmpty()) {
            return '不存在的主键：' . $id;
        }
        // 5. 更新
        $obj->content = $content;
        $obj->match_type = $match_type;
        $obj->save();

        return '编辑成功ID:' . $id;
    }

    /**
     * 违禁词检查
     * @param $message
     * @return array|null
     * @throws BadRequestException
     */
    public static function check($message): ?array
    {
        if (empty($message)) {
            return null;
        }
        try {
            $words = BannedWordsModel::where('status', 1)->select();
            if (!$words->isEmpty()) {
                // 循环匹配文本消息
                foreach ($words as $row) {
                    $match_type = (int)$row->match_type; // 匹配模式
                    $content = $row->content;   // 匹配内容
                    switch ($match_type) {
                        case 1:     // 内容等价
                            if (0 === strcasecmp($content, $message)) {
                                return $row->toArray();
                            }
                            break;
                        case 2:     // 关键字包含
                            if (stripos($message, $content) !== false) {
                                return $row->toArray();
                            }
                            break;
                        case 3:     // 正则表达式
                            // 正则匹配模式：i忽略大小写,s点号通配模式,U懒惰模式
                            if (preg_match('#' . $content . '#isU', $message, $matches)) {
                                return $row->toArray();
                            }
                            break;
                        default:
                            break;
                    }
                }
            }
        } catch (Exception $ex) {
            // 数据库出错啦
            throw new BadRequestException($ex->getMessage(), $ex->getCode());
        }

        return null;
    }
}
